/*
 * Promise 
 * - 异步回调
 * - 状态管理器 (pending - 等待中，resolve - 已处理，reject - 执行错误) 
 * 
 * 以下写法可以直接放到浏览器网页编辑模式下 - Console 中执行，可以更清楚看到 promise 的状态
 */
(function(){
    var promise = new Promise(function(resolve, reject) {
        setTimeout(() => {
            resolve(3)
            // reject(new Error('error allen'))
        }, 300);
    }).then(function(res) {
        console.log(res)
    }).catch(function(err) {
        console.log(err)
    })
    
    console.log(promise)
    
    setTimeout(() => {
        console.log(promise)
    }, 600);
})()

/*
 * 执行 then 和 catch 会返回一个新的 promise, 该 promise 最终状态根据 then 和 catch 的回调函数的执行结果决定
 * - 如果回调函数最终是 throw, 该 promise 是 rejected 状态
 * - 如果回调函数最终是 return，该 promise 是 resolved 状态
 * - 如果回调函数最终 return 了一个 promise3, 该 promise 会和回调函数 return 的 promise3 状态保持一致
 */
var promise = interview()
var promise2 = promise
        .then(function(res){
            throw new Error('fail')
        })
        .catch(function(err){
            return 'success'
        })
    setTimeout(() => {
        console.log(promise)  
        console.log(promise2) 
    }, 500);

/*
 * Promise 多级嵌套 实例
 * - 上一个 then 中 promise 更新了状态，才会执行下一个 then
 * catch： 所有的 promise rejected 状态都会到这里
 */
var promise = interview()
        .then(() => {
            interview()
        })
        .then(() => {
            interview()
        })
        .then(() => {
            interview()
        })
        .catch(() => {
            
        })

/*
 * Promise 并发异步 的实例
 * - all 中是同时需要执行的 promise
 * - then：所有的 promise 都成功才执行
 * - catch: 只要有一个 promise 失败，就会执行（不知道所有的 promise 的结果）
 */
Promise
        .all([
            interview(),
            interview()
        ])
        .then(() => {

        })
        .catch(() => {

        })

/*
 * Promise 实现一个简单的异步回调
 */
var promise = interview()
promise
    .then(function(res) {
        console.log('smile')
    })
    .catch(function(err) {
        console.log('cry')
    })


function interview() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (Math.random() > 0.2) {  
                resolve('success')
            }else {
                reject(new Error('fail'))
            }
        }, 300);
    })
}

